package educar.gui.admin.panels;

import java.awt.BorderLayout;
import java.awt.Component;
import java.awt.ComponentOrientation;
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;

import javax.swing.JButton;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.UIManager;

import javax.swing.border.TitledBorder;
import javax.swing.table.DefaultTableModel;

import educar.controllers.DeleteStudentController;
import educar.controllers.IController;
import educar.gui.IView;
import educar.gui.admin.AddStudent;
import educar.gui.admin.EditStudent;
import educar.gui.admin.SearchStudent;
import educar.idioma.Locale;
import educar.listeners.ButtonListener;
import educar.models.Student;
import educar.models.User;
import educar.models.studentNotFound;


@SuppressWarnings("serial")
public class StudentPanel implements IView{
	/*arreglo que da nombre a las columnas*/
	public String[] columnNames = {};
	/*matriz que contiene los datos de la tabla*/
	public Object[][] data = {};
	/*modelo de la tabla*/
	DefaultTableModel model = new DefaultTableModel(data,columnNames);
	/*tabla no editable*/	
	public JTable table = new JTable(model) {public boolean isCellEditable(int rowIndex, int colIndex) {return false;}};
	/*contenedor principal del panel*/
	private JPanel contenedor;
		
	/**
	 * Constructor de la clase
	 * crea un nuevo panel y agrega los elementos
	 * a mostrar: la tabla y el menu de opciones
	 */
	public StudentPanel(){		
		/*Creo el contenedor*/
		contenedor = new JPanel(new BorderLayout());
		/*configuro la tabla*/
		table.setUpdateSelectionOnSort(false);
		table.setBorder(UIManager.getBorder("TextField.border"));
		table.setFillsViewportHeight(true);
		/*creo un panel con scroll para insertar la tabla y permitir navegar*/
		JScrollPane scrollPane = new JScrollPane(table);
		/*agrego la tabla y el panel de botones al panel principal*/
		contenedor.add(scrollPane,BorderLayout.CENTER);
		contenedor.add(ABMPanel(),BorderLayout.PAGE_END);
		/*Actualizo la tabla con la base de datos*/
		Refresh();
}

	/**
	 * Crea el panel que contiene los botones de ABM
	 * */
	private JPanel ABMPanel(){		
		/*Creo el Panel de los Botones y lo configuro*/
		JPanel buttonsPane = new JPanel();
		buttonsPane.setLayout(new FlowLayout());
		
		/*Creo otro panel Contenedor con Titulo*/
		JPanel panel = new JPanel();
		panel.setBorder(new TitledBorder(null, "ABM Panel", TitledBorder.LEADING, TitledBorder.TOP, null, null));
		panel.setLayout(new FlowLayout());
		/*configuro la orientacion de los componentes*/
		buttonsPane.setComponentOrientation(ComponentOrientation.LEFT_TO_RIGHT);
		/*
		 * luego agrego el panel al panel principal uno dentro
		 * del otro para que queden centrado en la pantalla 
		 */		
		buttonsPane.add(panel);		
		
		/*Boton agregar usuario*/
		JButton bAdd = new JButton(Locale.ADD+" "+Locale.STUDENT);
		panel.add(bAdd);
		bAdd.addActionListener(new ActionListener () {public void actionPerformed(ActionEvent e){Add();}});
		bAdd.setAlignmentX(Component.RIGHT_ALIGNMENT);
		/*Boton editar usuario*/
		JButton bEdit = new JButton(Locale.EDIT+" "+Locale.STUDENT);
		panel.add(bEdit);
		bEdit.addActionListener(new ActionListener () {public void actionPerformed(ActionEvent e){Edit();}});
		bEdit.setAlignmentX(Component.RIGHT_ALIGNMENT);
		/*Boton borrar usuario*/
		JButton bDelete = new JButton(Locale.DELETE+" "+Locale.STUDENT);
		panel.add(bDelete);
		ButtonListener buttonListener = new ButtonListener();
		IController deleteController = new DeleteStudentController(table);
		deleteController.setView(this);
		buttonListener.associate(bDelete, deleteController);	
		bDelete.setAlignmentX(Component.RIGHT_ALIGNMENT);
		/*Boton buscar usuario*/
		JButton bSerach = new JButton(Locale.SEARCH+" "+Locale.STUDENT);
		panel.add(bSerach);
		bSerach.addActionListener(new ActionListener () {public void actionPerformed(ActionEvent e){new SearchStudent(table);}});
		bSerach.setAlignmentX(Component.RIGHT_ALIGNMENT);
		
		/*devuelvo el panel creado*/
		return buttonsPane;
	}


	/**
	 * Funcion que devuelve el contenedor del panel principal
	 */
	public JPanel getContenedor() {
		return contenedor;
	}
	
	/**
	 * Funcion que retorna la tabla JTable
	 * Sirve para obtener columna seleccionada o 
	 * seleccionar una columna entre otros
	 * @return JTable "tabla principal"
	 */
	public JTable getTable() {
		return table;
	}
	
	/**
	 * Obtiene el modelo de tabla
	 * sirve entre otros para obtener los datos
	 * y la fila de nombres
	 * @return DefaultTableModel "modelo de tabla"
	 */
	public DefaultTableModel getTableModel(){
		return model;
	}
	
	/**
	 * establece el nombre de las columnas
	 * @param newNames "arreglo con los nombres nuevos"
	 */
	public void setColumnNames (String [] newNames) {
		columnNames = newNames;
	}
	
	
	/**
	 * retorna el nombre de las columnnas
	 * @return String[] "arreglo con el nombre de las columnas"
	 */
	public String[] getColumnNames () {
		return columnNames;
	}
	
	/**
	 * Permite cambiar los datos actuales de la tabla
	 * @param newData "matriz de object (datos)"
	 */
	public void setData (Object [][] newData) {
		data = newData;		
	}
	
	/**
	 * retorna la matriz de datos
	 * @return Object[][] "matriz de datos"
	 */
	public Object[][] getData(){
		return data;
	}
	
	/**
	 * Refresco la tabla que se muestra por pantalla
	 */
	public void Refresh() {
		String[] student = {"Nro Alumno","DNI","Nombre","Apellido","Usuario","Sexo","Direccion","Telefono","e-Mail","Fecha Nacimiento"};		
		Object[][] studentTalbe = Student.getStudentTable();		
		setData(studentTalbe);
		setColumnNames(student);
		model.setDataVector(data, columnNames);
	}
		
	
	/*
	 * Metodos internos Abrir Ventanas y Actualizar 
	 */
	
	/**
	 * Abre la ventana de agregar nuevo alumno
	 */
	private void Add() {
		String[] userList = User.getStudentUserListNotInUse();
		if (userList.length == 0) {
			JOptionPane.showMessageDialog(null, Locale.FIRST_C_NEW_USER + " " + Locale.STUDENT, " "+Locale.NOT_USER_AV,2);
		}
		else {
			AddStudent tmp = new AddStudent(userList);		
			tmp.addWindowListener(new WindowAdapter(){
				/*cuando la ventana se cerro actualizo lo mostrado por pantalla*/
				public void windowClosed(WindowEvent e){
					Refresh();
				}
			});	
		}		
	}
	
	
	
	/**
	 * Abre la ventana de editar alumno
	 */
	private void Edit() {
		/*obtengo la fila seleccionada*/
		final int fila = table.getSelectedRow();
		if (fila == -1) {
			JOptionPane.showMessageDialog(null,Locale.FIRST_SELECT_ROW,Locale.NOT_ROW_SELECTED,JOptionPane.WARNING_MESSAGE);
		}
		else {
			try {
				Student old = Student.getStudentByDni((model.getValueAt(fila, 1).toString()));	
				String[] userListTmp = User.getStudentUserListNotInUse();
				String[] userList = new String[userListTmp.length+1];
				userList[0] = old.getUser().getUsername();
				for (int i=0;i<userListTmp.length;i++) {
					userList[i+1] = userListTmp[0];
				}	
				EditStudent tmp = new EditStudent(userList,old);				
				tmp.setUserNameAndBox(old.getUser().getUsername());
				tmp.setName(old.getNombre());
				tmp.setLastName(old.getApellido());
				tmp.setDNI(old.getDni());
				tmp.setAdress(old.getDireccion());
				tmp.setTelNumber(old.getTelefono());
				tmp.setEmail(old.getEmail());
				tmp.setSex(old.getSexo());
				String[] dat1 = old.getFecha_nac().split("-");
				tmp.setYearAndBox(dat1[0]);
				tmp.setMonthAndBox(dat1[1]);
				tmp.setDayAndBox(dat1[2]);				
				tmp.addWindowListener(new WindowAdapter(){
					/*cuando la ventana se cerro actualizo lo mostrado por pantalla*/
					public void windowClosed(WindowEvent e){
						Refresh();
					}
				});
			} catch (NumberFormatException e) {
				e.printStackTrace();
			} catch (studentNotFound e) {
				e.printStackTrace();
			}
		}
	}

	/**
	 * uso el present de iview para actualizar la tabla
	 */
	public void present(String model) {
		Refresh();		
	}

	public void close() {
		 //Nada por ahora		
		}
}